#include "DBService.h"

#include "Logger.h"
#include <sstream>

DBService* DBService::instance = NULL;

DBService::DBService(){

	//creo un conector
	this->conectorMySql = new ConectorMySql(this->datosConexion = new DatosConexion(DEFAULT_DB_HOST, DEFAULT_DB_NAME, DEFAULT_DB_USER, DEFAULT_DB_PASS));
	//this->conectorMySql = new ConectorMySql(this->datosConexion = new DatosConexion("localhost","pacman","root","92590365"));

	//creo los daos
	this->jugadorDAO = new JugadorDAO(this->conectorMySql);
	this->juegoDAO = new JuegoDAO(this->conectorMySql);
}

DBService* DBService::getInstance(){

	if(instance == NULL)
		instance = new DBService();

	return instance;
}

bool DBService::isConexionCorrecta(){
	return this->conectorMySql->validarConexion();
}

bool DBService::existeNombreUsuario(const string& login){
	return this->jugadorDAO->getIdByUsername(login) != NULL;
}

bool DBService::crearUsuario(const string& login, const string& pass){
	return this->jugadorDAO->crearJugador(login, login, pass);
}

bool DBService::esLoginValido(const string& loginP1, const string& passP1, const string& loginP2, const string& passP2){
	return this->jugadorDAO->validaJugador(loginP1, passP1) && this->jugadorDAO->validaJugador(loginP2, passP2);
}

void DBService::iniciarJuegoEntre(const string& loginP1, const string& loginP2){
	
	std::stringstream ss;
	ss << "Iniciado juego entre " << loginP1 << " y " << loginP2 ;
	Logger::getInstance()->debug(ss.str());
	Logger::getInstance()->flush();

	this->juegoDAO->crearJuego(loginP1, loginP2);
}

void DBService::finalizarJuegoEntre(const string& loginP1,int puntosA, const string& loginP2, int puntosB){
	
	std::stringstream ss;
	ss << "Finalizando juego entre " << loginP1 << "(" << puntosA << ") y " << loginP2 << "(" << puntosB <<")" ;
	Logger::getInstance()->debug(ss.str());
	Logger::getInstance()->flush();

	std::stringstream ss1,ss2;
	ss1 << puntosA ;
	ss2 << puntosB ;
	this->juegoDAO->finalizarJuego(loginP1,ss1.str(),loginP2,ss2.str()) ;
}

Lista<ItemEstadistica>* DBService::getRankingPartidosGanados(){
	return this->juegoDAO->getJugadoresPorPartidosGanados();
/*
	Lista<ItemEstadistica>* ranking = new Lista<ItemEstadistica>();

	ranking->agregar(new ItemEstadistica("coco", "1"));
	ranking->agregar(new ItemEstadistica("manuel", "2"));
	ranking->agregar(new ItemEstadistica("silvestre", "2"));
	ranking->agregar(new ItemEstadistica("obdulio", "4"));

	return ranking;*/
}

Lista<ItemEstadistica>* DBService::getRankingPartidosJugados(){
	return this->juegoDAO->getJugadoresPorPartidosJugados();
/*	Lista<ItemEstadistica>* ranking = new Lista<ItemEstadistica>();

	ranking->agregar(new ItemEstadistica("manuel", "1"));
	ranking->agregar(new ItemEstadistica("silvestre", "1"));
	ranking->agregar(new ItemEstadistica("coco", "2"));
	ranking->agregar(new ItemEstadistica("obdulio", "5"));

	return ranking;*/
}

Lista<ItemEstadistica>* DBService::getRankingPuntos(){
	return this->juegoDAO->getJugadoresPorPuntos();
/*	Lista<ItemEstadistica>* ranking = new Lista<ItemEstadistica>();

	ranking->agregar(new ItemEstadistica("manuel", "18278"));
	ranking->agregar(new ItemEstadistica("silvestre", "1877"));
	ranking->agregar(new ItemEstadistica("coco", "278"));
	ranking->agregar(new ItemEstadistica("obdulio", "50"));

	return ranking;*/
}

Lista<ItemEstadistica>* DBService::getRankingTiempoJugado(){
	return this->juegoDAO->getJugadoresPorTiempoJugado();
/*	Lista<ItemEstadistica>* ranking = new Lista<ItemEstadistica>();

	ranking->agregar(new ItemEstadistica("manuel", "24"));
	ranking->agregar(new ItemEstadistica("silvestre", "21"));
	ranking->agregar(new ItemEstadistica("coco", "12"));
	ranking->agregar(new ItemEstadistica("obdulio", "5"));

	return ranking;*/
}

Lista<ItemComparativoEstadistica>* DBService::getComparacion(const string& usuarioA, const string& usuarioB){
	return this->juegoDAO->getComparativaEntre(usuarioA ,usuarioB);
/*	Lista<ItemComparativoEstadistica>* comparacion = new Lista<ItemComparativoEstadistica>();

	comparacion->agregar(new ItemComparativoEstadistica("manuel", "202", "320", "30"));
	comparacion->agregar(new ItemComparativoEstadistica("silvestre", "22", "3", "30"));
	comparacion->agregar(new ItemComparativoEstadistica("coco", "2002", "320", "30"));
	comparacion->agregar(new ItemComparativoEstadistica("obdulio", "202", "320", "30"));

	return comparacion;*/
}
